#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#include <sys/shm.h>
#include "StdThread.h"
#include <sys/sem.h>
#include <semaphore.h>
// sem_t sem[3];
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond =PTHREAD_COND_INITIALIZER;
int flag=0;
void  *printa(void*arg)
{
    while(1)
    {

        pthread_mutex_lock(&mutex);
        // sem_wait(&sem[0]);
        if(flag==0)
        {
            printf("A\n");
            sleep(1);
            // sem_post(&sem[1]);
            pthread_cond_signal(&cond);
            flag=1;
        }
        else
        {
            pthread_cond_wait(&cond,&mutex);
        }
        pthread_mutex_unlock(&mutex);
    }
}
void  *printb(void*arg)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(flag==1)
        {
            
            // sem_wait(&sem[1]);
            printf("B\n");
            sleep(1);
            pthread_cond_signal(&cond);
            flag=0;
        }
        else
        {
            pthread_cond_wait(&cond,&mutex);
        }
        // sem_post(&sem[2]);
        pthread_mutex_unlock(&mutex);
    }
}
void  *printc(void*arg)
{
    while(1)
    {
        // sem_wait(&sem[2]);
        printf("C\n");
        sleep(1);
        // sem_post(&sem[0]);
    }
}

void main()
{
    // sem_init(&sem[0],0,1);
    // sem_init(&sem[1],0,0);
    // sem_init(&sem[2],0,0);
    thread *t1=InitThread(printa,NULL);
    thread *t2=InitThread(printb,NULL);
    // thread *t3=InitThread(printc,NULL);
    
    JoinThread(t1);
    JoinThread(t2);
    // JoinThread(t3);
    // for(int i=0;i<3;i++)
    // {
    //     sem_destroy(&sem[i]);
    // }
    pthread_cond_destroy(&cond);
    pthread_mutex_destroy(&mutex);
    CloseThread(t1);
    CloseThread(t2);
    
}